<template><div><h1 id="如何设计一个微博系统" tabindex="-1"><a class="header-anchor" href="#如何设计一个微博系统"><span>如何设计一个微博系统</span></a></h1>
<h3 id="_1-确定问题需求" tabindex="-1"><a class="header-anchor" href="#_1-确定问题需求"><span>1. 确定问题需求</span></a></h3>
<p>这一步主要确定问题的需求和系统使用场景，为了搞清楚这个问题，需要和面试官你来我往地问问题。</p>
<p>在做设计的同时，问面试官的要求是什么，作出合理的假设、取舍，让面试官看出你的思考过程，最终综合所有的信息完成一个还不错的设计。不要害怕问问题。那并不会说明我们不懂，而是让面试官理解我们的思考过程。当我们问出问题后，面试官要么给出明确的回答；要么让我们自己做出假设。当需要做出假设时，我们需要把假设写下来备用。</p>
<p>这个举个例子，比如面试官让你设计微博，因为微博的功能较为庞大，例如发微博、微博时间线、关注、取消关注、微博热搜榜等等，我们无法在短短的面试时间内完成这么多功能设计，所以这时候可以询问面试官我们需要实现哪些功能。</p>
<p>比如需要实现微博时间线功能，我们得进一步确定，整体用户量多大，系统QPS多大，因为这涉及到我们后续的系统设计，而且如果对于QPS特别高的情况，在后续的设计中需要针对此进行专门的扩展性优化。</p>
<p><strong>QPS有什么用？</strong></p>
<ul>
<li>OPS=100，那么用你的笔记本作Web服务器就好了；</li>
<li>QPS=1K，一台好点的Wevb服务器也能应付，需要考虑Single Point Failure；</li>
<li>QPS=1m，则需要建设一个1000台Web服务器的集群，并且考虑如何maintainance(某一台挂了怎么办)；</li>
</ul>
<p>QPS和服务器/数据库之间的关系：</p>
<ul>
<li>一台Web Server承受量约1K的QPS（考虑到逻辑处理时间以及数据库查询的瓶颈）；</li>
<li>一台SQL Database承受量约1K的QPS（如果JOIN和INDEX query比较多的话，这个值会更小）；</li>
<li>一台NoSQL Database（Cassandra）约承受量是10K的QPS；</li>
<li>一台NoSQL Database（Memcached）约承受量是1M的QPS；</li>
</ul>
<p>以下是一些通用的问题，可以通过询问系统相关的问题，搞清楚面试官的意图和系统的使用场景。</p>
<ul>
<li>系统的功能是什么？</li>
<li>系统的目标群体是什么？</li>
<li>系统的用户量有多大？</li>
<li>希望每秒钟处理多少请求？</li>
<li>希望处理多少数据？</li>
<li>希望的读写比率?</li>
<li>系统的扩张规模怎么样，这涉及到后续的扩展。</li>
</ul>
<p><strong>总结，在这一步，不要设计具体的系统，把问题搞清楚就行。不要害怕问问题， 那并不会说明我们不懂，而是让面试官理解我们的思考过程。</strong></p>
<h3 id="_2-完成整体设计" tabindex="-1"><a class="header-anchor" href="#_2-完成整体设计"><span>2. 完成整体设计</span></a></h3>
<p>这一步根据系统的具体要求，我们将其规划为几个功能独立的模块，然后做出一张整体的架构图，并依据此架构图，看是否能实现上一步所提出的需求。</p>
<p>如果可能的话，设想几个具体的例子，对着图演练一遍。这让我们能更坚定当前的设计，有时候还能发现一些未考虑到的边界case。</p>
<p>这里说的比较抽象，具体可以参考下面的实战环节，来理解如何完成整体设计。</p>
<h3 id="_3-深入模块设计" tabindex="-1"><a class="header-anchor" href="#_3-深入模块设计"><span>3. 深入模块设计</span></a></h3>
</div></template>


